package ihm;

import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import contracts.ContractException;

import services.MoteurJeuService;
import services.VilainService;
import utils.Bombe;
import utils.Commande;
import utils.Entity;
import utils.Resultat;
import utils.Sante;
import utils.Tresor;
import utils.Type;
import utils.TypeVilain;



public class TerrainJeu extends JPanel implements KeyListener{

	private static final long serialVersionUID = 1L;
	private Case[][] cases;
	private MoteurJeuService jeu;
	private JLabel label;
	public boolean verif=false;
	private int xHero;
	private int yHero;
	private int xKid;
	private int ykid;

	public TerrainJeu(MoteurJeuService jeu, JLabel label) throws ContractException{
		this.jeu=jeu;
		this.label=label;
		
		setLayout(new GridLayout(jeu.getTerrain().getNombreLignes(),
				jeu.getTerrain().getNombreColonnes()));
		
		cases= new Case[jeu.getTerrain().getNombreLignes()]
				[jeu.getTerrain().getNombreColonnes()];
		
		
		for(int i=0; i<jeu.getTerrain().getNombreLignes(); i++){
			for(int j=0; j<jeu.getTerrain().getNombreColonnes(); j++){
				Case c=null;

				
				if(jeu.getTerrain().getBloc(j, i).getType().equals(Type.VIDE)){
					if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.BOMBPASS))
						c=new Case(Tresor.BOMBPASS);
					else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.BOMBUP))
						c=new Case(Tresor.BOMBUP);
					else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.FIREUP))
						c=new Case(Tresor.FIREUP);
					else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.FIRESUIT))
						c= new Case(Tresor.FIRESUIT);
					else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.WALLPASS))
						c=new Case(Tresor.WALLPASS);
					else c=new Case(Tresor.RIEN);
					add(c);
					c.addKeyListener(this);
				}
				if(jeu.getTerrain().getBloc(j, i).getType().equals(Type.MURBRIQUE)){//brique
					c=new Case(Type.MURBRIQUE);
					add(c);
					c.addKeyListener(this);
				}
				if(jeu.getTerrain().getBloc(j, i).getType().equals(Type.MURMETAL)){
					c=new Case(Type.MURMETAL);
					add(c);
					c.addKeyListener(this);
				}
				cases[i][j] = c;
			}
		}
		
		int i,j;
		i = jeu.getHerosX();
		j = jeu.getHerosY();
		xHero=i;
		yHero=j;
		cases[i][j] = new Case(Entity.BOMBERMAN);
		remove((i*jeu.getTerrain().getNombreColonnes())+j);
		add(cases[i][j],(i*jeu.getTerrain().getNombreColonnes())+j);
		cases[i][j].addKeyListener(this);

		i = jeu.getKidnappeurX();
		j = jeu.getKidnappeurY();
		xKid=i;
		ykid=j;


		cases[i][j] = new Case(Entity.KIDNAPPEUR);
		remove((i*jeu.getTerrain().getNombreColonnes())+j);
		add(cases[i][j],(i*jeu.getTerrain().getNombreColonnes())+j);
		cases[i][j].addKeyListener(this);

		for(VilainService v : jeu.getListeVilain()){
			i = v.getX();
			j = v.getY();
			Case c=null;
			if(v.getType().equals(TypeVilain.FANTOMEBLEU)){
				c =new Case(Entity.FANTOMEBLEU);
			}else{
				c=new Case(Entity.BALLONORANGE);

			}
			cases[i][j] = c;
			remove((i*jeu.getTerrain().getNombreColonnes())+j);
			add(c,(i*jeu.getTerrain().getNombreColonnes())+j);
			c.addKeyListener(this);
		}

		for(Integer in : jeu.getBombeNumeros()){
			i=jeu.getBombe(in).getX();
			j = jeu.getBombe(in).getY();
			Case c= new Case(Bombe.BOMBE);
			cases[i][j]=c;
			remove(i*jeu.getTerrain().getNombreColonnes()+j);
			add(c,(i*jeu.getTerrain().getNombreColonnes()+j));
			c.addKeyListener(this);

		}

	}



	public void updateGui() throws ContractException{
		//mise du panel
		Case c=null;

		//mise a jours des blocs pour faire aparaitre les tresor cach� derniere les bloc brique explos�s maintenant
		for(int i=0; i<jeu.getTerrain().getNombreLignes();i++){
			for(int j=0;j<jeu.getTerrain().getNombreColonnes();j++){
				c=null;
				if(jeu.getTerrain().getBloc(j, i).getType().equals(Type.VIDE)){
					if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.BOMBPASS))
						c=new Case(Tresor.BOMBPASS);
					else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.BOMBUP))
						c=new Case(Tresor.BOMBUP);
					else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.FIREUP)){
						c=new Case(Tresor.FIREUP);
					}else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.FIRESUIT)){
						c=new Case(Tresor.FIRESUIT);
					}else if(jeu.getTerrain().getBloc(j, i).getTresor().equals(Tresor.WALLPASS)){
						c=new Case(Tresor.WALLPASS);
					}
					else c=new Case(Type.VIDE);

					cases[i][j] = c;
					remove((i*jeu.getTerrain().getNombreColonnes())+j);
					add(cases[i][j],(i*jeu.getTerrain().getNombreColonnes())+j);
					cases[i][j].addKeyListener(this);

				}

			}
		}

		//remise a jour de la position du heros
		if(jeu.getTerrain().getBloc(yHero, xHero).getType().equals(Type.VIDE)){
			c=new Case(Type.VIDE);
		}else if(jeu.getTerrain().getBloc(yHero, xHero).getType().equals(Type.MURBRIQUE)){
			c=new Case(Type.MURBRIQUE);
		}else{
			c=new Case(Type.MURMETAL);
		}
		cases[xHero][yHero]=c;
		remove((xHero*jeu.getTerrain().getNombreColonnes())+yHero);
		System.out.println(xHero+"   "+yHero+" "+((xHero*jeu.getTerrain().getNombreColonnes())+yHero)+ cases[xHero][yHero]);
		add(cases[xHero][yHero],(xHero*jeu.getTerrain().getNombreColonnes())+yHero);
		cases[xHero][yHero].addKeyListener(this);


		int i,j;
		i = jeu.getHerosX();
		j = jeu.getHerosX();
		xHero=i;
		yHero=j;
		cases[i][j] = new Case(Entity.BOMBERMAN);
		remove((i*jeu.getTerrain().getNombreColonnes())+j);
		add(cases[i][j],(i*jeu.getTerrain().getNombreColonnes())+j);
		cases[i][j].addKeyListener(this);


		if(jeu.getTerrain().getBloc(ykid, xKid).getType().equals(Type.VIDE))
			c=new Case(Type.VIDE);
		cases[xKid][ykid]=c;
		remove((xKid*jeu.getTerrain().getNombreColonnes())+ykid);
		add(cases[xKid][ykid],(xKid*jeu.getTerrain().getNombreColonnes())+ykid);
		cases[xKid][ykid].addKeyListener(this);


		int ii = jeu.getKidnappeurX();	
		int jj = jeu.getKidnappeurY();	
		xKid=ii;
		ykid=jj;

		cases[ii][jj] = new Case(Entity.KIDNAPPEUR);
		remove((ii*jeu.getTerrain().getNombreColonnes())+jj);
		add(cases[ii][jj],(ii*jeu.getTerrain().getNombreColonnes())+jj);
		cases[ii][jj].addKeyListener(this);

		for(VilainService v : jeu.getListeVilain()){
			i = v.getX();
			j = v.getY();
			c=null;
			if(v.getType().equals(TypeVilain.FANTOMEBLEU)){
				c =new Case(Entity.FANTOMEBLEU);
			}else{
				c=new Case(Entity.BALLONORANGE);

			}
			cases[i][j] = c;
			remove((i*jeu.getTerrain().getNombreColonnes())+j);
			add(c,(i*jeu.getTerrain().getNombreColonnes())+j);
			c.addKeyListener(this);
		}

		for(Integer in : jeu.getBombeNumeros()){
			if(jeu.getBombe(in)==null)continue;
			i=jeu.getBombe(in).getX();
			j = jeu.getBombe(in).getY();
			c= new Case(Bombe.BOMBE);
			cases[i][j]=c;
			remove(i*jeu.getTerrain().getNombreColonnes()+j);
			add(c,(i*jeu.getTerrain().getNombreColonnes()+j));
			c.addKeyListener(this);

		}
		/*for(int x=0;i<=jeu.getTerrain().getNombreLignes()-1;i++)
			for(int y=0;j<=jeu.getTerrain().getNombreColonnes()-1;j++){
				if (jeu.getTerrain().getBloc(x, y).getType().equals(Type.VIDE)){
					cases[x][y]=new Case(TypeG.VIDE);
					remove(x*jeu.getTerrain().getNombreColonnes()+y);
					add(cases[x][y],x*jeu.getTerrain().getNombreColonnes()+y);
					cases[x][y].addKeyListener(this);
				}
			}
		 */

		//mise a jour du score
		System.out.println("pas jeu restant "+(jeu.getMaxPasJeu()-jeu.getPasJeuCourrant()));
		label.setText("Pas restant "+(jeu.getMaxPasJeu()-jeu.getPasJeuCourrant()));
		verifierFin();
		repaint();

	}

	public void verifierFin() throws HeadlessException, ContractException{
		if(verif) return;
		if(jeu.estFini()){
			verif=true;
			if(jeu.resultatFinal().equals(Resultat.HEROSGAGNE))
				JOptionPane.showMessageDialog(this,"Le heros gagne !!!!");
			if(jeu.resultatFinal().equals(Resultat.KIDNAPPEURGAGNE))
				JOptionPane.showMessageDialog(this,"Kidnappeur gagne !!!!");
			if(jeu.resultatFinal().equals(Resultat.PARTIENULLE))
				JOptionPane.showMessageDialog(this,"NULL !!!!");
			else  JOptionPane.showMessageDialog(this,"Perdu!!!!");
		}
	}

	@Override
	public void keyPressed(KeyEvent e){
		if(verif) return;
		if(jeu.getHerosSante().equals(Sante.MORT)) 
			return ;
		if(e.getKeyCode()==KeyEvent.VK_UP)
			try {
				jeu.pasJeu(Commande.HAUT,true);
			} catch (ContractException e1) {}
		else if(e.getKeyCode()==KeyEvent.VK_DOWN)
			try {
				jeu.pasJeu(Commande.BAS,true);
			} catch (ContractException e1) {}
		else if(e.getKeyCode()==KeyEvent.VK_LEFT)
			try {
				jeu.pasJeu(Commande.GAUCHE,true);
			} catch (ContractException e1) {e1.printStackTrace();}
		else if(e.getKeyCode()==KeyEvent.VK_RIGHT)
			try {
				jeu.pasJeu(Commande.DROITE,true);
			} catch (ContractException e1) {e1.printStackTrace();}
		else if(e.getKeyCode()==KeyEvent.VK_ENTER)
			try {
				jeu.pasJeu(Commande.BOMBE,true);
			} catch (ContractException e1) {e1.printStackTrace();}
		else if(e.getKeyCode()==KeyEvent.VK_Z)
			try {
				jeu.pasJeu(Commande.BAS,false);
			} catch (ContractException e1) {e1.printStackTrace();}
		else if(e.getKeyCode()==KeyEvent.VK_S)
			try {
				jeu.pasJeu(Commande.HAUT, false);
			} catch (ContractException e1) {e1.printStackTrace();}
		else if(e.getKeyCode()==KeyEvent.VK_Q)
			try {
				jeu.pasJeu(Commande.GAUCHE, false);
			} catch (ContractException e1) {e1.printStackTrace();}
		else if(e.getKeyCode()==KeyEvent.VK_D)
			try {
				jeu.pasJeu(Commande.DROITE, false);
			} catch (ContractException e1) {e1.printStackTrace();}
		else if(e.getKeyCode()==KeyEvent.VK_SPACE)
			try {
				jeu.pasJeu(Commande.BOMBE, false);
			} catch (ContractException e1) {e1.printStackTrace();}
		else{
			
		}
		try {
			updateGui();
		} catch (ContractException e1) {e1.printStackTrace();}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {

	}

	@Override
	public void keyTyped(KeyEvent arg0) {

	}

}